物件導向程式設計 (Object-oriented programming) 是眾多程式設計典範 (Programming paradigms) 當中的其中一種。
「典範」的概念來自於孔恩的科學革命的結構一書,其原本的意義是指
在一研究社群裡,為各個會員分子所認同接受的整體性信念、價值和研究方法
而根據【跨科際閱讀】 典範 (Paradigm) 的解釋
廣義地說,它代表一個科學社群整體的理論、信念、價值、方法、目標、專業與教育結構
「典範」來自科學研究上,如果來到了程式設計的領域,簡單來說「典範」就是一群人所相信的理論、價值與方法。
所以「典範」不是標準答案,也不是唯一的真理。因為不同群的人,就會有不同對於程式設計的理論、價值、方法。
除了物件導向程式設計之外,另外常聽到的是函式程式設計 (Functional programming),而這兩者又分別隸屬於程式設計典範的兩大類:
在宣告式和指令式之外,還有
等等。
不過要注意的是,這些典範並非互斥 (譬如使用了 A 就不能用 B),而是針對相同、或不同問題而產生出來的解決方法。
同時,沒有絕對優勢的設計典範,也並非某種問題只能依賴某種典範來解決,面對一個問題的時候,只有相對優勢的方法 (甚至沒有優勢的方法,只能期待未來有人針對該問題發展出新的方法),就看當下我們想要採用哪種方式來解決問題。
關於常見的宣告式程式設計和指令式程式設計的比較,可以參考這篇文章的介紹。
回過頭來,我們來看看物件導向程式設計究竟是個什麼樣的設計典範。
The basic idea of OOP is that we use objects to model real world things that we want to represent inside our programs, and/or provide a simple way to access functionality that would otherwise be hard or impossible to make use of.
Objects can contain related data and code, which represent information about the thing you are trying to model, and functionality or behavior that you want it to have.
根據 MDN 的解釋,物件導向程式設計的基本概念是「透過物件 (object) 來模擬真實世界的事物」,並提供方法來操作它。
物件本身包含了「資料」和「方法」,如果以真實世界的事物來說,「資料」就是事物的特質、資訊或屬性,而「方法」就是該事物與其他事物互動的方式。
譬如這裡有個物件叫做大谷翔平,他的資料可能就包含
他與世界互動的方法可能就包含
可以看到資料以「屬性」和「值」的方式配對出現。另外一提的是,在真實世界中,「值」通常帶有單位,才能展現其真實意義。如果只說
可能就不知道是 300萬新台幣還是美金。然而在程式設計的過程中,單位有時候不見得這麼「外顯」,所以需要特別留意。
很快提一下在物件導向程式設計當中,常常會提到的概念與特徵,像是
會在後續的文章中陸續介紹。
最後,回過頭來看,為什麼要討論「物件導向程式設計」?
剛剛有提到,其實一路以來有許多的程式設計典範,來協助我們處理各種問題。雖然每個典範都有他的優缺點與適用性,不過「物件導向程式設計」還是被廣為使用和討論,因為它在面對真實世界複雜問題的時候,擁有較好的
在需求快速變動的現在,物件導向程式設計成為許多人解決問題的利器。
當然它也是有缺點的,像是程式碼的 size 相對較大,以及需要投入較多的時間與心力來建構它。
最後,來分享以前看過的影片 4 Programming Paradigms In 40 Minutes